﻿#ifndef MG_DEVICE_H
#define MG_DEVICE_H

#include "ite/itp.h" //for all ith driver (include GPIO) & MACRO
#include <sys/ioctl.h>
#include <unistd.h>

//灯光驱动类型
#define TLC59116			1
#define HTR3212				2
#define LED_DRIVER_TYPE		HTR3212

//消息状态真值
typedef enum
{
	OFF = 0,
	ON = 1,
}ENUM_MSG_STATE;

//两参数结合,exemple:MACRO_CONCAT2(Menu,1)-->Menu1
#define MACRO_CONCAT2_EXPAND(a, b)  		a ## b		
#define MACRO_CONCAT2(a, b)         	MACRO_CONCAT2_EXPAND(a, b)
//三参数结合
#define MACRO_CONCAT3_EXPAND(a, b, c) 		a ## b ## c
#define MACRO_CONCAT3(a, b, c)      	MACRO_CONCAT3_EXPAND(a, b, c)
//两参数中取参数1
#define MACRO_ARG21(a, b)           	a
//两参数中取参数2
#define MACRO_ARG22(a, b)           	b
typedef union
{
	uint16_t Value;
	struct
	{
		uint8_t  L;
		uint8_t  H;
	}byte;
}UINT16;
typedef union
{
	uint32_t Value;
	struct
	{
		uint8_t  L;
		uint8_t  mL;
		uint8_t  mH;
		uint8_t  H;
	}byte;
	struct
	{
		UINT16 L;
		UINT16 H;
	}word;
}UINT32;
typedef struct
{
	int r;
	int g;
	int b;
} RGB;

typedef struct
{
	double h;
	double s;
	double b;
} HSB;

RGB hsb_to_rgb(uint16_t H, uint8_t S, uint8_t B);
HSB rgb_to_hsb(uint8_t R, uint8_t G, uint8_t B);


#pragma pack(push) //开始对齐
#pragma pack(1)    //内存以1字节对齐
//主机配置模块参数
typedef union
{
	uint8_t ConfigTable[256];
	struct
	{
		uint8_t Null;					//无用(可用作临时变量)
		uint8_t	Panal_EN;				//面板是否启用(默认：0x01 面板启用)
		uint8_t	FontSize;				//字体及字号设置（预留）(默认：0x00)
		uint8_t	SleepTimeover;			//休眠时间：1 - 30（单位10s），0xff不修眠(默认：0x06 60s)
		uint8_t	LightPercent;			//面板亮度(默认：80)
		uint8_t MenuType;				//菜单模式(默认：0x04 灰色单事件菜单)
		uint8_t Screensaver_En;			//屏保开关(默认：0x02 屏保开启)
		uint8_t Screensaver_Type;		//屏保界面类型(默认：0x01 模拟时钟屏保)
		uint8_t Surname[10];			//姓氏
		uint8_t Gesture_En;				//手势开关(默认：0x02 手势开)
		uint8_t Gesture_Config;			//手势姿势使能设置(默认：0x0F 全开)
		uint16_t ScrollingTime;			//屏保滚动间隔时间(小端)
		uint8_t Rotate_Light;			//旋转时灯光效果(默认：0x02 跟手闪亮)---------------------------0x27及以上版本支持
		uint8_t Rotate_Voice;			//旋转时声音(默认：0x01 开)-------------------------------------0x29及以上版本支持
		uint8_t res[8];					//预留
		uint16_t ScreensaverLoop_Select;//循环屏保选择(默认：0x01FF 全选)-------------------------------0x2B及以上版本支持
	}byte;
} MODULE_CONFIG;
MODULE_CONFIG	Sys_Config;			//模块配置参数
//系统参数
typedef struct __SYSTEM_EEPROM_VALUE__
{
	uint8_t 				Addr;			//设备地址v
	uint8_t					Channal;		//通道数v
	uint16_t     			Type;			//设备类型号(本地设备类型)
	bool					IsDemoMode;		//是否进入演示模式
	uint8_t					Language;		//语言(中文：0x00，英文：0x01)
	uint32_t 				TypeChl;		//通道设备存在指示
	uint8_t					TypeChlNum[16];	//通道类型号
}SYSTEM_EEPROM_VALUE;
extern volatile SYSTEM_EEPROM_VALUE	Sys;

//模块运行参数
typedef struct __DEVICE_STATE_VALUE__
{
	bool 					Lcd_Is_Sleep;	//屏幕是否睡眠
	uint8_t 				LedRing_Switch;	//LED环常量开关
	uint8_t 				LedRing_Brightness;	//LED环亮度
	float					Current_Temp;	//室内温度
}DEVICE_STATE_VALUE;
extern volatile DEVICE_STATE_VALUE	Dev;
#pragma pack(pop)

//最大可支持设备
#define DeviceNumMax		30	

/*********TFT设备属性结构体*********/
#pragma pack(push) //开始对齐
#pragma pack(1)    //内存以1字节对齐

//场景/序列类型结构体
typedef struct __TFT_SceneType_S__
{
	UINT32 DeviceID;
	uint8_t DeviceIcon;
	uint8_t DeviceNameLen;
	uint8_t DeviceName[32];
}TFT_SceneType_S;
//设备类型结构体
typedef struct __TFT_DeviceType_S__
{
	UINT32 DeviceID;
	uint8_t DeviceIcon;
	uint16_t DeviceType;
	uint8_t DeviceNameLen;
	uint8_t DeviceName[30];
}TFT_DeviceType_S;
//设备/场景共同体
typedef union
{
	TFT_DeviceType_S TFT_Device;
	TFT_SceneType_S TFT_Scene;
}TFT_D_S;
//设备名称的换行结构体
typedef struct __UTF8_TWO_LINE__
{
	uint8_t DeviceName1[32];
	uint8_t DeviceName2[32];
}UTF8_TWO_LINE;

//用于菜单显示的设备结构体
typedef struct __TFT_Display_Device__
{
	bool DeviceIsAllocation;	//设备是否配置（true:配置,false:未配置）
	uint8_t DeviceKeyVol;		//设备按键编号
	uint8_t DeviceEventType;	//设备事件类型（1：设备	2：场景	3：序列 4：清洁模式）
	TFT_D_S TFTSCEQ;			//设备属性（ID,Icon,Type,NameLen,Name)
}Type_TFT_Device;
//用于显示设置
extern volatile Type_TFT_Device TFT_Device[DeviceNumMax + 1];

//当前显示状态
typedef struct __TFT_Display_Config__
{
	uint8_t TFT_Display_Device;	//当前显示的设备序号
}TFT_Display_Config;
extern volatile TFT_Display_Config DisplayValue;

#pragma pack(pop)
/*********TFT设备状态*********/
#pragma pack(push) //开始对齐
#pragma pack(1)    //内存以1字节对齐
/*****************电机******************/
typedef struct
{
	uint8_t status;		//状态
	uint8_t route;		//行程 	
	uint8_t angle;		//角度	
}IT_MOTOR_STATUS;
/***************************************/

/******************灯*******************/
typedef struct
{
	uint8_t status;
	uint8_t data[8];
}IT_LIGHT_STATUS;
/***************************************/

/*****************空调******************/
typedef union
{
	struct
	{
		uint8_t Backlight_Grade : 3;//00 off 01 Auto 2 High 3 mid 4 low
		uint8_t Speed : 2;
		uint8_t Mode : 3; //01 cool 	  
	}Byte;
	uint8_t  vol;
}IT_AIR_STATUS_VALUE;//空调设置值
typedef union
{
	struct
	{
		uint8_t FanLevel : 4;		//0:None 1:Auto 2:Dowm 3:Up
		uint8_t FanVertical : 4;	//0:None 1:Auto 2:Left 3:Right
	}Byte;
	uint8_t  vol;
}IT_AIR_FANXIANG;//空调设置值
typedef struct
{
	uint8_t status;
	IT_AIR_STATUS_VALUE Air_Status_Value;
	uint8_t Set_Temp;//设置温度   温度*2
	uint8_t Room_Temp_L; //环境温度
	uint8_t Room_Temp_H;
	uint8_t Extend_Mode; //扩展模式
	uint8_t Extend_Speed; //扩展风速
	IT_AIR_FANXIANG FanXiang;
}IT_AIR_STATUS;
typedef struct
{
	uint8_t status;
	uint8_t Set_Mode; //模式
	uint8_t Set_Temp;//设置温度  
	uint8_t Set_Speed; //风速
	IT_AIR_FANXIANG FanXiang;
}IT_MATCHING_AIR_STATUS;
/***************************************/

/**********地暖（德信金茂专用）*********/
typedef struct
{
	uint8_t status;
	uint16_t Set_Temp;		//设置温度	温度*10
	uint16_t Room_Temp;		//环境温度	温度*10
	uint8_t Room_Hum;		//湿度
	uint8_t Error_Code;		//故障代码
}IT_DX_HEAT_STATUS;
/***************************************/

/**********地暖（中南中心专用）*********/
typedef struct
{
	uint8_t status;
	uint16_t Set_Temp;		//设置温度	温度*10
	uint16_t Room_Temp;		//环境温度	温度*10
	uint8_t Room_Hum;		//湿度
	uint8_t Error_Code;		//故障代码
	uint8_t Sleep_Mode;		//睡眠模式
}IT_ZNZX_HEAT_STATUS;
/***************************************/

/****************毛细总控***************/



/***************************************/

/****************毛细分机***************/



/***************************************/

/******************地暖*****************/
typedef union
{
	struct
	{
		uint8_t Backlight_Grade : 4;//00 off 01 Auto 2 High 3 mid 4 low  背光
		uint8_t Timer_Status : 2; //定时器开关 0关  1开
		uint8_t Freeze_Proof_Status : 2; //防冻  0关  1开  
	}Byte;
	uint8_t vol;
}IT_HEAT_STATUS_VALUE;//地暖设置值
typedef struct
{
	uint8_t status;
	IT_HEAT_STATUS_VALUE  Heat_Status_Value;
	uint8_t Set_Temp;		//设置温度
	uint8_t Room_Temp_L;		//环境温度
	uint8_t Room_Temp_H;
}IT_HEAT_STATUS;
/***************************************/

/******************新风*****************/
typedef union
{
	struct
	{
		uint8_t Backlight_Grade : 4;//00 off 01 Auto 2 High 3 mid 4 low  背光
		uint8_t FanSpeed : 4; //风速  00 自动  01低速  2  中速  3 高速 
	}Byte;
	uint8_t vol;
}IT_CDAOS_STATUS_VALUE;//新风设置值
typedef struct
{
	uint8_t status; //状态
	IT_CDAOS_STATUS_VALUE Cdaos_Status_Value;
	uint16_t Set_Value;	//设置值
	uint16_t Cur_Value;	//当前值
	uint16_t Cur_Temp;	//当前温度
	uint8_t res1;
	uint8_t res2; 
	uint8_t Mode;		//模式
}IT_CDAOS_STATUS;
/***************************************/

/******************电视*****************/
typedef struct
{
	uint8_t status; //状态
	uint8_t Volume;
	uint8_t P;	//二氧化碳设置值
}IT_TV_STATUS;
/***************************************/

/****************背景音乐***************/
typedef struct
{
	uint8_t status;		//开关状态
	uint8_t Volume;		//音量
	uint8_t PlayMode;	//播放模式
	uint8_t PlaySource;	//播放音源
	uint8_t Effect;		//音效
	uint8_t flag;		//协议上定义的标记
}IT_MUSIC_STATUS;
/***************************************/

#define MG_DEVICE_STATE_MAX_LEN		32
#define MG_DEVICE_CONFIG_MAX_LEN	256

typedef  union
{
	IT_MOTOR_STATUS		IT_Motor_Status;
	IT_LIGHT_STATUS		IT_Light_Status;
	IT_AIR_STATUS		IT_Air_Status;
	IT_MATCHING_AIR_STATUS	IT_Matching_Air_Status;
	IT_HEAT_STATUS		IT_Heat_Status;
	IT_CDAOS_STATUS		IT_Cdaos_Status;
	IT_TV_STATUS		IT_TV_Status;
	IT_MUSIC_STATUS		IT_Music_Status;
	IT_DX_HEAT_STATUS	IT_DX_Heat_Status;
	IT_ZNZX_HEAT_STATUS	IT_ZNZX_Heat_Status;
	uint8_t  data[MG_DEVICE_STATE_MAX_LEN];
}IT_DEV_STATUS;//设备状态共同体

/****************空调参数***************/
typedef struct
{
	uint8_t Config_NULL;				//无用参数
	uint8_t	Key_Mode;					//按键模式（0x01默认配置，0x02配置模式）
	uint8_t	Key_Func[8];				//按键功能定义(按键功能号)
	uint8_t	TurnOn_Dispay;				//开机界面显示
	uint8_t	TurnOff_Dispay;				//关机界面显示
	uint8_t TurnOn_Way;					//开机方式（0x01短按开机，0x02长按开机）
	uint8_t Light_Compensation_Plus;	//光感正补偿
	uint8_t Light_Compensation_Minus;	//光感负补偿
	uint8_t Custom_Wind;				//自定义风速
	uint16_t Custom_Mode;				//自定义模式
	struct{
		uint8_t Max : 7;					//温度范围最大值
		uint8_t	Grads : 1;				//温度梯度/精度（0x00:0.5度,0x01:1度）
		uint8_t Min : 7;					//温度范围最小值
		uint8_t	res : 1;					//预留
	}Air_Temp_Range;					//空调温度范围
	uint8_t	TurnOff_Led_State;			//关机LED亮灭配置
	uint8_t Chinese_Show;				//中文显示配置
	struct{
		uint8_t Plus : 4;					//继电器跳变正温差
		uint8_t	Minus : 4;				//继电器跳变负温差
	}Relay_Diff;
	uint8_t BackLight_Percent;			//背光百分比配置
	uint8_t Custom_Vertical_Dir;		//自定义垂直风向
	uint8_t Custom_Level_Dir;			//自定义水平风向
	struct{
		uint8_t Max : 7;					//温度范围最大值
		uint8_t	Grads : 1;				//温度梯度/精度（0x00:0.5度,0x01:1度）
		uint8_t Min : 7;					//温度范围最小值
		uint8_t	res : 1;					//预留
	}Heat_Temp_Range;					//地暖温度范围
	uint8_t Low_Temp_Protection;		//低温保护开关(无用)
	uint8_t Vertical_Dir_Mode;			//垂直风向模式(无用)
	uint8_t Body_Sensing_Distance;		//人感感应距离
	uint8_t Body_Light_Time;			//感应灯光熄灭时间
	uint8_t Hum_Grade_Set;				//湿度等级设置(无用)
	uint8_t Seasonal_Pattern;			//季节模式
	uint8_t Relay_Mode;					//本地继电器控制阀门类型（1:四管制，2:二管制+地暖模式，3:二管制+地暖通道，4三线阀）
	struct{
		uint8_t Mode_Cool_En : 1;			//制冷模式禁使能
		uint8_t Mode_Heat_En : 1;			//制热模式禁使能
		uint8_t Mode_Preheat_En : 1;		//预热模式禁使能
		uint8_t Mode_HeatPlus_En : 1;		//地暖加制热模式禁使能
		uint8_t Mode_HeatType_En : 1;		//地暖模式禁使能
		uint8_t res : 2;
		uint8_t Immobilization : 1;		//固定位（固定为0）				
	}Mode_function;						//模式禁使能
	uint8_t BackLight_DimmingOnTime;	//背光点亮时间(100ms)
	uint8_t BackLight_DimmingOffTime;	//背光熄灭时间(100ms)
	uint8_t res[90];					//注意128字节对齐
	uint8_t Seasonal_Switch;			//季节模式开关//地址0x80
	struct{
		uint8_t Mouth;					//月
		uint8_t	Day;					//日
	}Summer_Start_Date;					//夏季开始日期
	struct{
		uint8_t Mouth;					//月
		uint8_t	Day;					//日
	}Summer_End_Date;					//夏季结束日期
	struct{
		uint8_t Mouth;					//月
		uint8_t	Day;					//日
	}Winter_Start_Date;					//冬季开始日期
	struct{
		uint8_t Mouth;					//月
		uint8_t	Day;					//日
	}Winter_End_Date;					//冬季结束日期
	struct{
		uint8_t Max;					//月
		uint8_t	Min;					//日
	}Summer_Air_Temp_Range;				//夏季空调温度范围
	struct{
		uint8_t Max;					//月
		uint8_t	Min;					//日
	}Winter_Air_Temp_Range;				//冬季空调温度范围
}IT_AIR_CONFIG;
/****************新风参数***************/
typedef struct
{
	uint8_t Config_NULL;		//无用参数
	uint8_t	Suppot;				//支持的设置参数
	uint8_t	In_Wind_Speed;		//进风风速
	uint8_t	Out_Wind_Speed;		//出风风速
	uint8_t	Mode_Suppot;		//自定义模式设置
	uint8_t res[79 - 5];		//预留
	uint8_t User_Mode1_Name[16];//自定义模式1名字
	uint8_t User_Mode2_Name[16];//自定义模式2名字
}IT_CDAOS_CONFIG;
typedef  union
{
	IT_CDAOS_CONFIG		IT_Cdaos_Config;
	uint8_t  data[MG_DEVICE_CONFIG_MAX_LEN];
}IT_DEV_CONFIG;//设备参数共同体
typedef  struct
{
	UINT32 Dev_ID;
	IT_DEV_STATUS IT_Dev_STatus_Value;
	IT_DEV_CONFIG IT_Dev_Config_Value;
}Type_TFT_Device_State;//设备总结构体
#pragma pack(pop)
extern volatile Type_TFT_Device_State TFT_Device_State[DeviceNumMax + 1];
extern volatile Type_TFT_Device_State TFT_Device_Cmd[DeviceNumMax + 1];

/********************************默认数据表（可配置）**********************************/
//系统默认参数
#define MG_LANGUAGE_CHS		0		//简体中文
#define MG_LANGUAGE_ENG		1		//英文
#define MG_LANGUAGE_ZHTW	2		//繁体中文
//新风默认风速范围
#define Cdaos_Wind_Min	1		//风速最小值
#define Cdaos_Wind_Max	4		//风速最大值
//地暖默认温度范围
#define Heat_Temp_Min	5		//最小温度
#define Heat_Temp_Max	30		//最大温度
//空调默认温度范围
#define KT_Temp_Min		16		//最小温度
#define KT_Temp_Max		31		//最大温度

//消息列表（可当标志）
#define MSG_RESEND_DATA					0									//重发数据标记
#define MSG_HARDWARE_TEST				MSG_RESEND_DATA				+ 1		//硬件测试模式
#define MSG_RS485_EN					MSG_HARDWARE_TEST			+ 1		//485通讯打开
#define MSG_GET_TIME					MSG_RS485_EN				+ 1		//向网关获取时间
#define MSG_HAVE_GET_TIME				MSG_GET_TIME				+ 1		//是否已经获取到主机时间
#define MSG_SCREENSAVER_PREVIEW			MSG_HAVE_GET_TIME			+ 1		//进入预览模式
#define MSG_SCREENSAVER_CUT				MSG_SCREENSAVER_PREVIEW		+ 1		//屏保滚动时的切换消息
#define MSG_LCD_SLEEP					MSG_SCREENSAVER_CUT			+ 1		//屏保3小时熄屏
#define MSG_SET_ADDR_TIME_OVER			MSG_LCD_SLEEP				+ 1		//开机设置设备地址超时
#define MSG_SAVE_SYS					MSG_SET_ADDR_TIME_OVER		+ 1		//保存系统参数
#define MSG_SAVE_SYS_CONFIG				MSG_SAVE_SYS				+ 1		//保存系统配置参数
#define MSG_SAVE_NOWDATA				MSG_SAVE_SYS_CONFIG			+ 1		//保存设备状态
#define MSG_SAVE_RENEW					MSG_SAVE_NOWDATA			+ 1		//恢复出厂数据并保存
#define MSG_SAVE_DEVICE_DATA			MSG_SAVE_RENEW				+ 1		//保存模块设备数据
#define MSG_SAVE_PHOTO1_DATA			MSG_SAVE_DEVICE_DATA		+ 1		//保存照片1
#define MSG_SAVE_PHOTO2_DATA			MSG_SAVE_PHOTO1_DATA		+ 1		//保存照片2
#define MSG_SAVE_PHOTO3_DATA			MSG_SAVE_PHOTO2_DATA		+ 1		//保存照片3
#define MSG_SAVE_CHILD_AIR_STATE		MSG_SAVE_PHOTO3_DATA		+ 1		//保存子设备1状态
#define MSG_SAVE_CHILD_HEAT_STATE		MSG_SAVE_CHILD_AIR_STATE	+ 1		//保存子设备2状态
#define MSG_SAVE_CHILD_CDOAS_STATE		MSG_SAVE_CHILD_HEAT_STATE	+ 1		//保存子设备3状态
#define MSG_SAVE_CHILD_AIR_CONFIG		MSG_SAVE_CHILD_CDOAS_STATE	+ 1		//保存子设备1参数
#define MSG_SAVE_CHILD_HEAT_CONFIG		MSG_SAVE_CHILD_AIR_CONFIG	+ 1		//保存子设备2参数
#define MSG_SAVE_CHILD_CDOAS_CONFIG		MSG_SAVE_CHILD_HEAT_CONFIG	+ 1		//保存子设备3参数
#define MSG_GUI_STATE_UPDATE			MSG_SAVE_CHILD_CDOAS_CONFIG	+ 1		//485数据导致的设备数据刷新
#define MSG_GUI_CONFIG_UPDATE			MSG_GUI_STATE_UPDATE		+ 1		//485数据导致的设备界面刷新
#define MSG_GUI_SWITCH_SCREENSAVER		MSG_GUI_CONFIG_UPDATE		+ 1		//485数据导致的屏保界面切换
#define MSG_GUI_SWITCH_SURNAME			MSG_GUI_SWITCH_SCREENSAVER	+ 1		//485数据导致的姓氏切换
#define MSG_GUI_SWITCH_MAINMENU			MSG_GUI_SWITCH_SURNAME		+ 1		//485数据导致的菜单类型切换
#define MSG_DEV_UPDATA_STAT				MSG_GUI_SWITCH_MAINMENU		+ 1		//设备状态更新上报
#define MSG_HEAT_UPDATA_STAT			MSG_DEV_UPDATA_STAT			+ 1		//地暖子设备状态更新上报
#define MSG_AIR_UPDATA_STAT				MSG_HEAT_UPDATA_STAT		+ 1		//空调子设备状态更新上报
#define MSG_CDOAS_UPDATA_STAT			MSG_AIR_UPDATA_STAT			+ 1		//新风子设备状态更新上报
#define MSG_GET_ALL_DEVICE_STATE		MSG_CDOAS_UPDATA_STAT		+ 1		//向网关获取所有设备的状态
#define MSG_GET_DEVICE_STATE_EN			MSG_GET_ALL_DEVICE_STATE	+ 1		//定时获取设备状态使能
#define MSG_GET_DEVICE_STATE			MSG_GET_DEVICE_STATE_EN		+ 1		//向网关获取当前设备的状态
#define MSG_GET_DEVICE_CONFIG_EN		MSG_GET_DEVICE_STATE		+ 1		//定时获取设备参数使能
#define MSG_GET_DEVICE_CONFIG			MSG_GET_DEVICE_CONFIG_EN	+ 1		//向网关获取当前设备的参数
#define MSG_ENTER_SCREENSAVER			MSG_GET_DEVICE_CONFIG		+ 1		//是否进入屏保界面
#define MSG_TOUCH_DOWN					MSG_ENTER_SCREENSAVER		+ 1		//触摸屏被按下
#define MSG_NUM							MSG_TOUCH_DOWN				+ 1		//消息标志总数
volatile ENUM_MSG_STATE		MessageFlag[MSG_NUM];//消息列表

#endif
